package libs

import (
	"github.com/natefinch/lumberjack"
	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
	"os"
)

var Logger *zap.Logger

func logInit() error {
	// 引擎
	encoderConfig := zap.NewProductionEncoderConfig()
	encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder // 修改日期配置
	encoder := zapcore.NewJSONEncoder(encoderConfig)

	// 写入文件
	//file, _ := os.OpenFile("./test.log", os.O_CREATE|os.O_APPEND|os.O_RDWR, 8744)
	//writeSyncer := zapcore.AddSync(file)

	// 实现文件切割/归类
	lumberJackLogger := &lumberjack.Logger{
		Filename:   "./" + LogConfig.FileName,
		MaxSize:    LogConfig.MaxSize,    // M
		MaxBackups: LogConfig.MaxBackups, // 最大备份数量
		MaxAge:     LogConfig.MaxAge,     // 最大备份天数
		Compress:   false,                // 是否压缩
	}
	writeSyncer := zapcore.AddSync(lumberJackLogger)

	// 初始化 Core
	// encoder: 引擎
	// writeSyncer: 写入配置
	// Level: 写入级别，什么级别的日志才可以被记录
	var core zapcore.Core

	if AppConfig.Env == "dev" {
		// 开发阶段
		// 把日志把日志持久化到文件，并输出到控制台
		consoleEncoder := zapcore.NewConsoleEncoder(zap.NewDevelopmentEncoderConfig())
		core = zapcore.NewTee(
			zapcore.NewCore(encoder, writeSyncer, zapcore.DebugLevel),
			zapcore.NewCore(consoleEncoder, zapcore.Lock(os.Stdout), zapcore.DebugLevel),
		)
	} else {
		// 生产阶段
		if LogConfig.Level == "debug" {
			// 开启 debug 级别
			core = zapcore.NewCore(encoder, writeSyncer, zapcore.DebugLevel)
		} else {
			// 默认
			core = zapcore.NewCore(encoder, writeSyncer, zapcore.InfoLevel)
		}
	}

	// 初始化自定义日志
	Logger = zap.New(
		core,
		zap.AddCaller(), // 添加函数调用信息
	)

	return nil
}
